{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Kaggle 10 monkeys 图像分类实战"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.13.1\n",
      "sys.version_info(major=3, minor=6, micro=4, releaselevel='final', serial=0)\n",
      "matplotlib 2.2.3\n",
      "numpy 1.16.2\n",
      "pandas 0.22.0\n",
      "sklearn 0.19.1\n",
      "tensorflow 1.13.1\n",
      "tensorflow._api.v1.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl,np,pd,sklearn,tf,keras:\n",
    "    print(module.__name__,module.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def solve_cudnn_error():\n",
    "    gpus = tf.config.experimental.list_physical_devices('GPU')\n",
    "    if gpus:\n",
    "        try:\n",
    "            # Currently, memory growth needs to be the same across GPUs\n",
    "            for gpu in gpus:\n",
    "                tf.config.experimental.set_memory_growth(gpu, True)\n",
    "            logical_gpus = tf.config.experimental.list_logical_devices('GPU')\n",
    "            print(len(gpus), \"Physical GPUs,\", len(logical_gpus), \"Logical GPUs\")\n",
    "        except RuntimeError as e:\n",
    "            # Memory growth must be set before GPUs have been initialized\n",
    "            print(e)\n",
    "\n",
    "solve_cudnn_error()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据读取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "True\n",
      "True\n",
      "['n4', 'n3', 'n8', 'n7', 'n1', 'n2', 'n5', 'n0', 'n9', 'n6']\n",
      "['n4', 'n3', 'n8', 'n7', 'n1', 'n2', 'n5', 'n0', 'n9', 'n6']\n"
     ]
    }
   ],
   "source": [
    "# 判断文件存在\n",
    "train_dir = 'training'\n",
    "valid_dir = 'validation'\n",
    "label_file = 'monkey_labels.txt'\n",
    "print(os.path.exists(train_dir))\n",
    "print(os.path.exists(valid_dir))\n",
    "print(os.path.exists(label_file))\n",
    "\n",
    "print(os.listdir(train_dir))\n",
    "print(os.listdir(valid_dir))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   Label     Latin Name              Common Name                     \\\n",
      "0  n0         alouatta_palliata\\t    mantled_howler                   \n",
      "1  n1        erythrocebus_patas\\t    patas_monkey                     \n",
      "2  n2        cacajao_calvus\\t        bald_uakari                      \n",
      "3  n3        macaca_fuscata\\t        japanese_macaque                 \n",
      "4  n4       cebuella_pygmea\\t        pygmy_marmoset                   \n",
      "5  n5       cebus_capucinus\\t        white_headed_capuchin            \n",
      "6  n6       mico_argentatus\\t        silvery_marmoset                 \n",
      "7  n7      saimiri_sciureus\\t        common_squirrel_monkey           \n",
      "8  n8       aotus_nigriceps\\t        black_headed_night_monkey        \n",
      "9  n9       trachypithecus_johnii    nilgiri_langur                   \n",
      "\n",
      "    Train Images    Validation Images  \n",
      "0             131                  26  \n",
      "1             139                  28  \n",
      "2             137                  27  \n",
      "3             152                  30  \n",
      "4             131                  26  \n",
      "5             141                  28  \n",
      "6             132                  26  \n",
      "7             142                  28  \n",
      "8             133                  27  \n",
      "9             132                  26  \n"
     ]
    }
   ],
   "source": [
    "# 读取labels\n",
    "labels = pd.read_csv(label_file, header=0)\n",
    "print(labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 对图像进行数据增强"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 1098 images belonging to 10 classes.\n",
      "Found 272 images belonging to 10 classes.\n",
      "1098 272\n"
     ]
    }
   ],
   "source": [
    "# 将图片转化成同一尺寸\n",
    "height = 128\n",
    "width = 128\n",
    "channels = 3\n",
    "batch_size = 64\n",
    "num_classes = 10\n",
    "\n",
    "# 读取图片并增强\n",
    "train_datagen = keras.preprocessing.image.ImageDataGenerator(\n",
    "    rescale= 1./255, # 缩放到0-1之间\n",
    "    rotation_range= 40, # 旋转范围\n",
    "    width_shift_range= 0.2, # 水平位移\n",
    "    height_shift_range= 0.2, # 竖直平移\n",
    "    shear_range= 0.2, # 剪切范围\n",
    "    zoom_range= 0.2, # 缩放范围\n",
    "    horizontal_flip= True, # 随机水平翻转\n",
    "    fill_mode= 'nearest', # 对空白位置的填充规则\n",
    ")\n",
    "# 按照文件夹进行分类，进行数据增强\n",
    "train_generator = train_datagen.flow_from_directory(\n",
    "    train_dir, target_size = (height, width), batch_size = batch_size,\n",
    "    seed = 7, shuffle = True, class_mode = 'categorical')\n",
    "\n",
    "valid_datagen = keras.preprocessing.image.ImageDataGenerator(\n",
    "    rescale= 1./255, # 缩放到0-1之间\n",
    ")\n",
    "valid_generator = valid_datagen.flow_from_directory(\n",
    "    valid_dir, target_size = (height, width), batch_size = batch_size,\n",
    "    seed = 7, shuffle = False, class_mode = 'categorical')\n",
    "\n",
    "train_num = train_generator.samples\n",
    "valid_num = valid_generator.samples\n",
    "print(train_num, valid_num)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(64, 128, 128, 3) (64, 10)\n",
      "[[0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]]\n"
     ]
    }
   ],
   "source": [
    "for i in range(1):\n",
    "    x, y = train_generator.next()\n",
    "    print(x.shape, y.shape)\n",
    "    print(y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 基础模型构建--CNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d (Conv2D)              (None, 128, 128, 32)      896       \n",
      "_________________________________________________________________\n",
      "conv2d_1 (Conv2D)            (None, 128, 128, 32)      9248      \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 64, 64, 32)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 64, 64, 64)        18496     \n",
      "_________________________________________________________________\n",
      "conv2d_3 (Conv2D)            (None, 64, 64, 64)        36928     \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 32, 32, 64)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_4 (Conv2D)            (None, 32, 32, 128)       73856     \n",
      "_________________________________________________________________\n",
      "conv2d_5 (Conv2D)            (None, 32, 32, 128)       147584    \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 16, 16, 128)       0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 32768)             0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 128)               4194432   \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 4,482,730\n",
      "Trainable params: 4,482,730\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Conv2D(filters=32, kernel_size=3, padding='same', activation='relu',\n",
    "                        input_shape=[width, height, channels]),\n",
    "    keras.layers.Conv2D(filters=32, kernel_size=3, padding='same', activation='relu'),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    \n",
    "    keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'),\n",
    "    keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    \n",
    "    keras.layers.Conv2D(filters=128, kernel_size=3, padding='same', activation='relu'),\n",
    "    keras.layers.Conv2D(filters=128, kernel_size=3, padding='same', activation='relu'),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    \n",
    "    keras.layers.Flatten(),\n",
    "    keras.layers.Dense(128, activation='relu'),\n",
    "    keras.layers.Dense(num_classes, activation='softmax'),\n",
    "])\n",
    "\n",
    "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.cast instead.\n",
      "Epoch 1/10\n",
      "5/5 [==============================] - 7s 1s/step - loss: 2.1272 - acc: 0.1985\n",
      "18/18 [==============================] - 31s 2s/step - loss: 2.2521 - acc: 0.1512 - val_loss: 2.1272 - val_acc: 0.1985\n",
      "Epoch 2/10\n",
      "5/5 [==============================] - 6s 1s/step - loss: 1.8041 - acc: 0.3456\n",
      "18/18 [==============================] - 26s 1s/step - loss: 2.0441 - acc: 0.2641 - val_loss: 1.8041 - val_acc: 0.3456\n",
      "Epoch 3/10\n",
      "5/5 [==============================] - 6s 1s/step - loss: 1.6674 - acc: 0.4044\n",
      "18/18 [==============================] - 27s 1s/step - loss: 1.8376 - acc: 0.3151 - val_loss: 1.6674 - val_acc: 0.4044\n",
      "Epoch 4/10\n",
      "5/5 [==============================] - 6s 1s/step - loss: 1.5530 - acc: 0.4228\n",
      "18/18 [==============================] - 27s 1s/step - loss: 1.7027 - acc: 0.3807 - val_loss: 1.5530 - val_acc: 0.4228\n",
      "Epoch 5/10\n",
      "5/5 [==============================] - 7s 1s/step - loss: 1.5608 - acc: 0.4412\n",
      "18/18 [==============================] - 27s 1s/step - loss: 1.5947 - acc: 0.4299 - val_loss: 1.5608 - val_acc: 0.4412\n",
      "Epoch 6/10\n",
      "5/5 [==============================] - 6s 1s/step - loss: 1.5559 - acc: 0.4890\n",
      "18/18 [==============================] - 27s 1s/step - loss: 1.5334 - acc: 0.4217 - val_loss: 1.5559 - val_acc: 0.4890\n",
      "Epoch 7/10\n",
      "5/5 [==============================] - 6s 1s/step - loss: 1.4228 - acc: 0.4559\n",
      "18/18 [==============================] - 27s 1s/step - loss: 1.5473 - acc: 0.4353 - val_loss: 1.4228 - val_acc: 0.4559\n",
      "Epoch 8/10\n",
      "5/5 [==============================] - 6s 1s/step - loss: 1.5100 - acc: 0.4890\n",
      "18/18 [==============================] - 27s 1s/step - loss: 1.5362 - acc: 0.4344 - val_loss: 1.5100 - val_acc: 0.4890\n",
      "Epoch 9/10\n",
      "5/5 [==============================] - 6s 1s/step - loss: 1.3626 - acc: 0.5331\n",
      "18/18 [==============================] - 27s 1s/step - loss: 1.4536 - acc: 0.4809 - val_loss: 1.3626 - val_acc: 0.5331\n",
      "Epoch 10/10\n",
      "5/5 [==============================] - 6s 1s/step - loss: 1.2504 - acc: 0.5331\n",
      "18/18 [==============================] - 26s 1s/step - loss: 1.3715 - acc: 0.4918 - val_loss: 1.2504 - val_acc: 0.5331\n"
     ]
    }
   ],
   "source": [
    "# 训练\n",
    "epochs = 10\n",
    "history = model.fit_generator(train_generator,\n",
    "                              steps_per_epoch= train_num // batch_size,\n",
    "                              epochs=epochs,\n",
    "                              validation_data=valid_generator,\n",
    "                              validation_steps= valid_num // batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['loss', 'acc', 'val_loss', 'val_acc'])\n"
     ]
    }
   ],
   "source": [
    "print(history.history.keys())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history, label, epochs, min_value, max_value):\n",
    "    data = {}\n",
    "    data[label] = history.history[label]\n",
    "    data['val_'+label] = history.history['val_'+label]\n",
    "    pd.DataFrame(data).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.axis([0, epochs, min_value, max_value])\n",
    "    plt.show()\n",
    "    \n",
    "plot_learning_curves(history, 'acc', epochs, 0, 1)\n",
    "plot_learning_curves(history, 'loss', epochs, 0, 2.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 迁移学习--RestNet50 finetune\n",
    "### 数据增强"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 1098 images belonging to 10 classes.\n",
      "Found 272 images belonging to 10 classes.\n",
      "1098 272\n"
     ]
    }
   ],
   "source": [
    "# 将图片转化成同一尺寸\n",
    "height = 224\n",
    "width = 224\n",
    "channels = 3\n",
    "batch_size = 24\n",
    "num_classes = 10\n",
    "\n",
    "# 读取图片并增强\n",
    "train_datagen = keras.preprocessing.image.ImageDataGenerator(\n",
    "    preprocessing_function=keras.applications.resnet50.preprocess_input,\n",
    "    rotation_range= 40, # 旋转范围\n",
    "    width_shift_range= 0.2, # 水平位移\n",
    "    height_shift_range= 0.2, # 竖直平移\n",
    "    shear_range= 0.2, # 剪切范围\n",
    "    zoom_range= 0.2, # 缩放范围\n",
    "    horizontal_flip= True, # 随机水平翻转\n",
    "    fill_mode= 'nearest', # 对空白位置的填充规则\n",
    ")\n",
    "train_generator = train_datagen.flow_from_directory(\n",
    "    train_dir, target_size = (height, width), batch_size = batch_size,\n",
    "    seed = 7, shuffle = True, class_mode = 'categorical')\n",
    "\n",
    "valid_datagen = keras.preprocessing.image.ImageDataGenerator(\n",
    "    preprocessing_function=keras.applications.resnet50.preprocess_input)\n",
    "valid_generator = valid_datagen.flow_from_directory(\n",
    "    valid_dir, target_size = (height, width), batch_size = batch_size,\n",
    "    seed = 7, shuffle = False, class_mode = 'categorical')\n",
    "\n",
    "train_num = train_generator.samples\n",
    "valid_num = valid_generator.samples\n",
    "print(train_num, valid_num)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(24, 224, 224, 3) (24, 10)\n",
      "[[0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]]\n"
     ]
    }
   ],
   "source": [
    "for i in range(1):\n",
    "    x, y = train_generator.next()\n",
    "    print(x.shape, y.shape)\n",
    "    print(y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### resnet50 finetune 模型构建"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A local file was found, but it seems to be incomplete or outdated because the md5 file hash does not match the original value of a268eb855778b3df3c7506639542a6af so we will re-download the data.\n",
      "Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.2/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5\n",
      "94658560/94653016 [==============================] - 315s 3us/step\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "resnet50 (Model)             (None, 2048)              23587712  \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 10)                20490     \n",
      "=================================================================\n",
      "Total params: 23,608,202\n",
      "Trainable params: 20,490\n",
      "Non-trainable params: 23,587,712\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "resnet50_fine_tune = keras.models.Sequential()\n",
    "resnet50_fine_tune.add(keras.applications.ResNet50(\n",
    "    include_top = False, pooling = 'avg', weights = 'imagenet'))\n",
    "resnet50_fine_tune.add(keras.layers.Dense(num_classes, activation='softmax'))\n",
    "resnet50_fine_tune.layers[0].trainable = False\n",
    "\n",
    "resnet50_fine_tune.compile(\n",
    "    loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])\n",
    "resnet50_fine_tune.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "12/12 [==============================] - 7s 588ms/step - loss: 0.7137 - acc: 0.8309\n",
      "46/46 [==============================] - 39s 844ms/step - loss: 1.5982 - acc: 0.5064 - val_loss: 0.7137 - val_acc: 0.8309\n",
      "Epoch 2/10\n",
      "12/12 [==============================] - 7s 560ms/step - loss: 0.4170 - acc: 0.9154\n",
      "46/46 [==============================] - 35s 754ms/step - loss: 0.7217 - acc: 0.8525 - val_loss: 0.4170 - val_acc: 0.9154\n",
      "Epoch 3/10\n",
      "12/12 [==============================] - 7s 578ms/step - loss: 0.2905 - acc: 0.9522\n",
      "46/46 [==============================] - 35s 760ms/step - loss: 0.4602 - acc: 0.9244 - val_loss: 0.2905 - val_acc: 0.9522\n",
      "Epoch 4/10\n",
      "12/12 [==============================] - 7s 571ms/step - loss: 0.2420 - acc: 0.9669\n",
      "46/46 [==============================] - 35s 756ms/step - loss: 0.3806 - acc: 0.9244 - val_loss: 0.2420 - val_acc: 0.9669\n",
      "Epoch 5/10\n",
      "12/12 [==============================] - 7s 577ms/step - loss: 0.2282 - acc: 0.9669\n",
      "46/46 [==============================] - 35s 760ms/step - loss: 0.3117 - acc: 0.9508 - val_loss: 0.2282 - val_acc: 0.9669\n",
      "Epoch 6/10\n",
      "12/12 [==============================] - 7s 570ms/step - loss: 0.1871 - acc: 0.9706\n",
      "46/46 [==============================] - 35s 759ms/step - loss: 0.2664 - acc: 0.9536 - val_loss: 0.1871 - val_acc: 0.9706\n",
      "Epoch 7/10\n",
      "12/12 [==============================] - 7s 570ms/step - loss: 0.1616 - acc: 0.9779\n",
      "46/46 [==============================] - 35s 753ms/step - loss: 0.2420 - acc: 0.9517 - val_loss: 0.1616 - val_acc: 0.9779\n",
      "Epoch 8/10\n",
      "12/12 [==============================] - 7s 576ms/step - loss: 0.1432 - acc: 0.9816\n",
      "46/46 [==============================] - 35s 758ms/step - loss: 0.2150 - acc: 0.9627 - val_loss: 0.1432 - val_acc: 0.9816\n",
      "Epoch 9/10\n",
      "12/12 [==============================] - 7s 572ms/step - loss: 0.1351 - acc: 0.9816\n",
      "46/46 [==============================] - 35s 753ms/step - loss: 0.1932 - acc: 0.9654 - val_loss: 0.1351 - val_acc: 0.9816\n",
      "Epoch 10/10\n",
      "12/12 [==============================] - 7s 566ms/step - loss: 0.1348 - acc: 0.9816\n",
      "46/46 [==============================] - 35s 762ms/step - loss: 0.1890 - acc: 0.9672 - val_loss: 0.1348 - val_acc: 0.9816\n"
     ]
    }
   ],
   "source": [
    "epochs = 10\n",
    "history_resnet = resnet50_fine_tune.fit_generator(\n",
    "    train_generator,\n",
    "    steps_per_epoch= train_num // batch_size,\n",
    "    epochs=epochs,\n",
    "    validation_data=valid_generator,\n",
    "    validation_steps= valid_num // batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curves(history_resnet, 'acc', epochs, 0, 1)\n",
    "plot_learning_curves(history_resnet, 'loss', epochs, 0, 2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 另一种resnet50 finetune，对resnet最后几层进行训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_3 (InputLayer)            (None, None, None, 3 0                                            \n",
      "__________________________________________________________________________________________________\n",
      "conv1_pad (ZeroPadding2D)       (None, None, None, 3 0           input_3[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "conv1 (Conv2D)                  (None, None, None, 6 9472        conv1_pad[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "bn_conv1 (BatchNormalizationV1) (None, None, None, 6 256         conv1[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "activation_98 (Activation)      (None, None, None, 6 0           bn_conv1[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "pool1_pad (ZeroPadding2D)       (None, None, None, 6 0           activation_98[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_5 (MaxPooling2D)  (None, None, None, 6 0           pool1_pad[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "res2a_branch2a (Conv2D)         (None, None, None, 6 4160        max_pooling2d_5[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "bn2a_branch2a (BatchNormalizati (None, None, None, 6 256         res2a_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_99 (Activation)      (None, None, None, 6 0           bn2a_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2a_branch2b (Conv2D)         (None, None, None, 6 36928       activation_99[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn2a_branch2b (BatchNormalizati (None, None, None, 6 256         res2a_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_100 (Activation)     (None, None, None, 6 0           bn2a_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2a_branch2c (Conv2D)         (None, None, None, 2 16640       activation_100[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "res2a_branch1 (Conv2D)          (None, None, None, 2 16640       max_pooling2d_5[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "bn2a_branch2c (BatchNormalizati (None, None, None, 2 1024        res2a_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn2a_branch1 (BatchNormalizatio (None, None, None, 2 1024        res2a_branch1[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_32 (Add)                    (None, None, None, 2 0           bn2a_branch2c[0][0]              \n",
      "                                                                 bn2a_branch1[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "activation_101 (Activation)     (None, None, None, 2 0           add_32[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res2b_branch2a (Conv2D)         (None, None, None, 6 16448       activation_101[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn2b_branch2a (BatchNormalizati (None, None, None, 6 256         res2b_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_102 (Activation)     (None, None, None, 6 0           bn2b_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2b_branch2b (Conv2D)         (None, None, None, 6 36928       activation_102[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn2b_branch2b (BatchNormalizati (None, None, None, 6 256         res2b_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_103 (Activation)     (None, None, None, 6 0           bn2b_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2b_branch2c (Conv2D)         (None, None, None, 2 16640       activation_103[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn2b_branch2c (BatchNormalizati (None, None, None, 2 1024        res2b_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_33 (Add)                    (None, None, None, 2 0           bn2b_branch2c[0][0]              \n",
      "                                                                 activation_101[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_104 (Activation)     (None, None, None, 2 0           add_33[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res2c_branch2a (Conv2D)         (None, None, None, 6 16448       activation_104[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn2c_branch2a (BatchNormalizati (None, None, None, 6 256         res2c_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_105 (Activation)     (None, None, None, 6 0           bn2c_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2c_branch2b (Conv2D)         (None, None, None, 6 36928       activation_105[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn2c_branch2b (BatchNormalizati (None, None, None, 6 256         res2c_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_106 (Activation)     (None, None, None, 6 0           bn2c_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2c_branch2c (Conv2D)         (None, None, None, 2 16640       activation_106[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn2c_branch2c (BatchNormalizati (None, None, None, 2 1024        res2c_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_34 (Add)                    (None, None, None, 2 0           bn2c_branch2c[0][0]              \n",
      "                                                                 activation_104[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_107 (Activation)     (None, None, None, 2 0           add_34[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res3a_branch2a (Conv2D)         (None, None, None, 1 32896       activation_107[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3a_branch2a (BatchNormalizati (None, None, None, 1 512         res3a_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_108 (Activation)     (None, None, None, 1 0           bn3a_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3a_branch2b (Conv2D)         (None, None, None, 1 147584      activation_108[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3a_branch2b (BatchNormalizati (None, None, None, 1 512         res3a_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_109 (Activation)     (None, None, None, 1 0           bn3a_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3a_branch2c (Conv2D)         (None, None, None, 5 66048       activation_109[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "res3a_branch1 (Conv2D)          (None, None, None, 5 131584      activation_107[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3a_branch2c (BatchNormalizati (None, None, None, 5 2048        res3a_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3a_branch1 (BatchNormalizatio (None, None, None, 5 2048        res3a_branch1[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_35 (Add)                    (None, None, None, 5 0           bn3a_branch2c[0][0]              \n",
      "                                                                 bn3a_branch1[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "activation_110 (Activation)     (None, None, None, 5 0           add_35[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res3b_branch2a (Conv2D)         (None, None, None, 1 65664       activation_110[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3b_branch2a (BatchNormalizati (None, None, None, 1 512         res3b_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_111 (Activation)     (None, None, None, 1 0           bn3b_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3b_branch2b (Conv2D)         (None, None, None, 1 147584      activation_111[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3b_branch2b (BatchNormalizati (None, None, None, 1 512         res3b_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_112 (Activation)     (None, None, None, 1 0           bn3b_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3b_branch2c (Conv2D)         (None, None, None, 5 66048       activation_112[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3b_branch2c (BatchNormalizati (None, None, None, 5 2048        res3b_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_36 (Add)                    (None, None, None, 5 0           bn3b_branch2c[0][0]              \n",
      "                                                                 activation_110[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_113 (Activation)     (None, None, None, 5 0           add_36[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res3c_branch2a (Conv2D)         (None, None, None, 1 65664       activation_113[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3c_branch2a (BatchNormalizati (None, None, None, 1 512         res3c_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_114 (Activation)     (None, None, None, 1 0           bn3c_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3c_branch2b (Conv2D)         (None, None, None, 1 147584      activation_114[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3c_branch2b (BatchNormalizati (None, None, None, 1 512         res3c_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_115 (Activation)     (None, None, None, 1 0           bn3c_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3c_branch2c (Conv2D)         (None, None, None, 5 66048       activation_115[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3c_branch2c (BatchNormalizati (None, None, None, 5 2048        res3c_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_37 (Add)                    (None, None, None, 5 0           bn3c_branch2c[0][0]              \n",
      "                                                                 activation_113[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_116 (Activation)     (None, None, None, 5 0           add_37[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res3d_branch2a (Conv2D)         (None, None, None, 1 65664       activation_116[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3d_branch2a (BatchNormalizati (None, None, None, 1 512         res3d_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_117 (Activation)     (None, None, None, 1 0           bn3d_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3d_branch2b (Conv2D)         (None, None, None, 1 147584      activation_117[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3d_branch2b (BatchNormalizati (None, None, None, 1 512         res3d_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_118 (Activation)     (None, None, None, 1 0           bn3d_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3d_branch2c (Conv2D)         (None, None, None, 5 66048       activation_118[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3d_branch2c (BatchNormalizati (None, None, None, 5 2048        res3d_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_38 (Add)                    (None, None, None, 5 0           bn3d_branch2c[0][0]              \n",
      "                                                                 activation_116[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_119 (Activation)     (None, None, None, 5 0           add_38[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res4a_branch2a (Conv2D)         (None, None, None, 2 131328      activation_119[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4a_branch2a (BatchNormalizati (None, None, None, 2 1024        res4a_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_120 (Activation)     (None, None, None, 2 0           bn4a_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4a_branch2b (Conv2D)         (None, None, None, 2 590080      activation_120[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4a_branch2b (BatchNormalizati (None, None, None, 2 1024        res4a_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_121 (Activation)     (None, None, None, 2 0           bn4a_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4a_branch2c (Conv2D)         (None, None, None, 1 263168      activation_121[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "res4a_branch1 (Conv2D)          (None, None, None, 1 525312      activation_119[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4a_branch2c (BatchNormalizati (None, None, None, 1 4096        res4a_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4a_branch1 (BatchNormalizatio (None, None, None, 1 4096        res4a_branch1[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_39 (Add)                    (None, None, None, 1 0           bn4a_branch2c[0][0]              \n",
      "                                                                 bn4a_branch1[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "activation_122 (Activation)     (None, None, None, 1 0           add_39[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res4b_branch2a (Conv2D)         (None, None, None, 2 262400      activation_122[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4b_branch2a (BatchNormalizati (None, None, None, 2 1024        res4b_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_123 (Activation)     (None, None, None, 2 0           bn4b_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4b_branch2b (Conv2D)         (None, None, None, 2 590080      activation_123[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4b_branch2b (BatchNormalizati (None, None, None, 2 1024        res4b_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_124 (Activation)     (None, None, None, 2 0           bn4b_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4b_branch2c (Conv2D)         (None, None, None, 1 263168      activation_124[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4b_branch2c (BatchNormalizati (None, None, None, 1 4096        res4b_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_40 (Add)                    (None, None, None, 1 0           bn4b_branch2c[0][0]              \n",
      "                                                                 activation_122[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_125 (Activation)     (None, None, None, 1 0           add_40[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res4c_branch2a (Conv2D)         (None, None, None, 2 262400      activation_125[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4c_branch2a (BatchNormalizati (None, None, None, 2 1024        res4c_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_126 (Activation)     (None, None, None, 2 0           bn4c_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4c_branch2b (Conv2D)         (None, None, None, 2 590080      activation_126[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4c_branch2b (BatchNormalizati (None, None, None, 2 1024        res4c_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_127 (Activation)     (None, None, None, 2 0           bn4c_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4c_branch2c (Conv2D)         (None, None, None, 1 263168      activation_127[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4c_branch2c (BatchNormalizati (None, None, None, 1 4096        res4c_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_41 (Add)                    (None, None, None, 1 0           bn4c_branch2c[0][0]              \n",
      "                                                                 activation_125[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_128 (Activation)     (None, None, None, 1 0           add_41[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res4d_branch2a (Conv2D)         (None, None, None, 2 262400      activation_128[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4d_branch2a (BatchNormalizati (None, None, None, 2 1024        res4d_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_129 (Activation)     (None, None, None, 2 0           bn4d_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4d_branch2b (Conv2D)         (None, None, None, 2 590080      activation_129[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4d_branch2b (BatchNormalizati (None, None, None, 2 1024        res4d_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_130 (Activation)     (None, None, None, 2 0           bn4d_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4d_branch2c (Conv2D)         (None, None, None, 1 263168      activation_130[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4d_branch2c (BatchNormalizati (None, None, None, 1 4096        res4d_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_42 (Add)                    (None, None, None, 1 0           bn4d_branch2c[0][0]              \n",
      "                                                                 activation_128[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_131 (Activation)     (None, None, None, 1 0           add_42[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res4e_branch2a (Conv2D)         (None, None, None, 2 262400      activation_131[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4e_branch2a (BatchNormalizati (None, None, None, 2 1024        res4e_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_132 (Activation)     (None, None, None, 2 0           bn4e_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4e_branch2b (Conv2D)         (None, None, None, 2 590080      activation_132[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4e_branch2b (BatchNormalizati (None, None, None, 2 1024        res4e_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_133 (Activation)     (None, None, None, 2 0           bn4e_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4e_branch2c (Conv2D)         (None, None, None, 1 263168      activation_133[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4e_branch2c (BatchNormalizati (None, None, None, 1 4096        res4e_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_43 (Add)                    (None, None, None, 1 0           bn4e_branch2c[0][0]              \n",
      "                                                                 activation_131[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_134 (Activation)     (None, None, None, 1 0           add_43[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res4f_branch2a (Conv2D)         (None, None, None, 2 262400      activation_134[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4f_branch2a (BatchNormalizati (None, None, None, 2 1024        res4f_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_135 (Activation)     (None, None, None, 2 0           bn4f_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4f_branch2b (Conv2D)         (None, None, None, 2 590080      activation_135[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4f_branch2b (BatchNormalizati (None, None, None, 2 1024        res4f_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_136 (Activation)     (None, None, None, 2 0           bn4f_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4f_branch2c (Conv2D)         (None, None, None, 1 263168      activation_136[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4f_branch2c (BatchNormalizati (None, None, None, 1 4096        res4f_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_44 (Add)                    (None, None, None, 1 0           bn4f_branch2c[0][0]              \n",
      "                                                                 activation_134[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_137 (Activation)     (None, None, None, 1 0           add_44[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res5a_branch2a (Conv2D)         (None, None, None, 5 524800      activation_137[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn5a_branch2a (BatchNormalizati (None, None, None, 5 2048        res5a_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_138 (Activation)     (None, None, None, 5 0           bn5a_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5a_branch2b (Conv2D)         (None, None, None, 5 2359808     activation_138[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn5a_branch2b (BatchNormalizati (None, None, None, 5 2048        res5a_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_139 (Activation)     (None, None, None, 5 0           bn5a_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5a_branch2c (Conv2D)         (None, None, None, 2 1050624     activation_139[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "res5a_branch1 (Conv2D)          (None, None, None, 2 2099200     activation_137[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn5a_branch2c (BatchNormalizati (None, None, None, 2 8192        res5a_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn5a_branch1 (BatchNormalizatio (None, None, None, 2 8192        res5a_branch1[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_45 (Add)                    (None, None, None, 2 0           bn5a_branch2c[0][0]              \n",
      "                                                                 bn5a_branch1[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "activation_140 (Activation)     (None, None, None, 2 0           add_45[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res5b_branch2a (Conv2D)         (None, None, None, 5 1049088     activation_140[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn5b_branch2a (BatchNormalizati (None, None, None, 5 2048        res5b_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_141 (Activation)     (None, None, None, 5 0           bn5b_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5b_branch2b (Conv2D)         (None, None, None, 5 2359808     activation_141[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn5b_branch2b (BatchNormalizati (None, None, None, 5 2048        res5b_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_142 (Activation)     (None, None, None, 5 0           bn5b_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5b_branch2c (Conv2D)         (None, None, None, 2 1050624     activation_142[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn5b_branch2c (BatchNormalizati (None, None, None, 2 8192        res5b_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_46 (Add)                    (None, None, None, 2 0           bn5b_branch2c[0][0]              \n",
      "                                                                 activation_140[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_143 (Activation)     (None, None, None, 2 0           add_46[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res5c_branch2a (Conv2D)         (None, None, None, 5 1049088     activation_143[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn5c_branch2a (BatchNormalizati (None, None, None, 5 2048        res5c_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_144 (Activation)     (None, None, None, 5 0           bn5c_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5c_branch2b (Conv2D)         (None, None, None, 5 2359808     activation_144[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn5c_branch2b (BatchNormalizati (None, None, None, 5 2048        res5c_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_145 (Activation)     (None, None, None, 5 0           bn5c_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5c_branch2c (Conv2D)         (None, None, None, 2 1050624     activation_145[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn5c_branch2c (BatchNormalizati (None, None, None, 2 8192        res5c_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_47 (Add)                    (None, None, None, 2 0           bn5c_branch2c[0][0]              \n",
      "                                                                 activation_143[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_146 (Activation)     (None, None, None, 2 0           add_47[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "global_average_pooling2d_2 (Glo (None, 2048)         0           activation_146[0][0]             \n",
      "==================================================================================================\n",
      "Total params: 23,587,712\n",
      "Trainable params: 23,534,592\n",
      "Non-trainable params: 53,120\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "resnet50 = keras.applications.ResNet50(\n",
    "    include_top = False, pooling = 'avg', weights = 'imagenet')\n",
    "resnet50.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "resnet50 (Model)             (None, 2048)              23587712  \n",
      "_________________________________________________________________\n",
      "dense_3 (Dense)              (None, 10)                20490     \n",
      "=================================================================\n",
      "Total params: 23,608,202\n",
      "Trainable params: 1,075,210\n",
      "Non-trainable params: 22,532,992\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "for layer in resnet50.layers[0:-5]:\n",
    "    layer.trainable = False\n",
    "\n",
    "resnet50_new = keras.models.Sequential([\n",
    "    resnet50,\n",
    "    keras.layers.Dense(num_classes, activation='softmax')\n",
    "])\n",
    "\n",
    "resnet50_new.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])\n",
    "resnet50_new.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "12/12 [==============================] - 7s 577ms/step - loss: 0.4070 - acc: 0.9228\n",
      "46/46 [==============================] - 36s 789ms/step - loss: 1.3233 - acc: 0.6184 - val_loss: 0.4070 - val_acc: 0.9228\n",
      "Epoch 2/10\n",
      "12/12 [==============================] - 7s 566ms/step - loss: 0.2020 - acc: 0.9559\n",
      "46/46 [==============================] - 35s 752ms/step - loss: 0.5248 - acc: 0.9126 - val_loss: 0.2020 - val_acc: 0.9559\n",
      "Epoch 3/10\n",
      "12/12 [==============================] - 7s 559ms/step - loss: 0.1853 - acc: 0.9522\n",
      "46/46 [==============================] - 35s 756ms/step - loss: 0.3561 - acc: 0.9372 - val_loss: 0.1853 - val_acc: 0.9522\n",
      "Epoch 4/10\n",
      "12/12 [==============================] - 7s 573ms/step - loss: 0.1433 - acc: 0.9669\n",
      "46/46 [==============================] - 35s 750ms/step - loss: 0.2651 - acc: 0.9581 - val_loss: 0.1433 - val_acc: 0.9669\n",
      "Epoch 5/10\n",
      "12/12 [==============================] - 7s 590ms/step - loss: 0.1485 - acc: 0.9559\n",
      "46/46 [==============================] - 35s 763ms/step - loss: 0.2176 - acc: 0.9590 - val_loss: 0.1485 - val_acc: 0.9559\n",
      "Epoch 6/10\n",
      "12/12 [==============================] - 7s 558ms/step - loss: 0.1351 - acc: 0.9485\n",
      "46/46 [==============================] - 35s 754ms/step - loss: 0.2071 - acc: 0.9581 - val_loss: 0.1351 - val_acc: 0.9485\n",
      "Epoch 7/10\n",
      "12/12 [==============================] - 7s 569ms/step - loss: 0.1494 - acc: 0.9449\n",
      "46/46 [==============================] - 35s 756ms/step - loss: 0.1903 - acc: 0.9608 - val_loss: 0.1494 - val_acc: 0.9449\n",
      "Epoch 8/10\n",
      "12/12 [==============================] - 7s 568ms/step - loss: 0.1069 - acc: 0.9596\n",
      "46/46 [==============================] - 35s 752ms/step - loss: 0.1770 - acc: 0.9627 - val_loss: 0.1069 - val_acc: 0.9596\n",
      "Epoch 9/10\n",
      "12/12 [==============================] - 7s 561ms/step - loss: 0.0971 - acc: 0.9632\n",
      "46/46 [==============================] - 34s 749ms/step - loss: 0.1613 - acc: 0.9654 - val_loss: 0.0971 - val_acc: 0.9632\n",
      "Epoch 10/10\n",
      "12/12 [==============================] - 7s 554ms/step - loss: 0.1033 - acc: 0.9596\n",
      "46/46 [==============================] - 34s 742ms/step - loss: 0.1373 - acc: 0.9763 - val_loss: 0.1033 - val_acc: 0.9596\n"
     ]
    }
   ],
   "source": [
    "epochs = 10\n",
    "history_resnet_new = resnet50_new.fit_generator(\n",
    "    train_generator,\n",
    "    steps_per_epoch= train_num // batch_size,\n",
    "    epochs=epochs,\n",
    "    validation_data=valid_generator,\n",
    "    validation_steps= valid_num // batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curves(history_resnet_new, 'acc', epochs, 0, 1)\n",
    "plot_learning_curves(history_resnet_new, 'loss', epochs, 0, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
